package com.syf.disruptor;

import com.lmax.disruptor.EventTranslatorOneArg;
import com.lmax.disruptor.RingBuffer;
import com.syf.model.Order;

/**
 * 【6】在boot里面使用它--发送消息(还需要一个RingBuffer):
 *          DisruptorTemplate.onData(Order)         //发送一条消息到高速缓存【发布--生产】
 *          OrderEventHandler.onEvent(OrderEvent)   //从ringbuffer中监听、接收到了某个消息进行处理【订阅--消费】
 *
 *          参考：https://blog.csdn.net/nuaazhaofeng/article/details/72918467
 *
 */
public class DisruptorTemplate {

    //委托单Order -> OrderEvent
    private static final EventTranslatorOneArg<OrderEvent, Order> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, Order>() {
        @Override
        public void translateTo(OrderEvent event, long sequence, Order input) {
            event.setSource(input);  //订单时间中 设置 数据源
        }
    };

    //创建DisruptorTemplate时，构造器注入 ringBuffer对象【DisruptorAutoConfiguration】
    private final RingBuffer<OrderEvent> ringBuffer;
    public DisruptorTemplate(RingBuffer<OrderEvent> ringBuffer) {
        this.ringBuffer = ringBuffer;
    }

    /**
     * 我们使用DisruptorTemplate--发布事件时：
     *      1.设置数据源Source
     *      2.就使用它的onData方法--发布事件消息(到无锁高速缓存中)
     *          Disruptor 的事件发布过程是一个两阶段提交的过程
     */
    public void onData(Order input) {
        ringBuffer.publishEvent(TRANSLATOR, input);   //发布事件(发布--订阅)    生产
    }
}

